package com.wind.sso.filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;

import com.wind.sso.util.HttpUtil;
import com.wind.sso.util.SSOClientUtil;

/*
 * 	拦截器要起效的话，必须注册到Tomcat容器中
 */
public class SSOClientFilter implements Filter{

	// 初始化方法
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}

	// 拦截方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		/*
			拦截器的request是ServletRequest    这里面没有session对象
			需要强转成HttpServerRequest
			拦截器的response是ServletResponse  这里面没有session对象
			需要强转成HttpServletResponse
		*/
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		// 获取session对象
		HttpSession session = req.getSession();
		// 1、判断是否有局部会话
		Boolean b = (Boolean) session.getAttribute("isLogin"); // 需要用包装类类接收 boolean类型会有问题
		// 如果局部会话不等于null并且局部会话为true
		if (b != null && b) {
			// 放行
			chain.doFilter(request, response);
			return ;
		}
		// 判断地址栏中是否有token
		String token = (String) req.getParameter("token");
		// token不为空，说明地址中携带了token，拥有令牌
		if (StringUtils.isNoneBlank(token)) {
			// 判断token是否由认证中心产生
			String httpURL = SSOClientUtil.SERVER_URL_PREFIX + "/verify";
			Map<String, String> params = new HashMap<String, String>();
			params.put("token", token);
			params.put("clientUrl", SSOClientUtil.getClientLogOutUrl());
			params.put("jsessionid", session.getId());
			try {
				String isVerify = HttpUtil.sendHttpRequest(httpURL, params);
				// 如果返回true 说明这个token是由认证中心产生
				if ("true".equals(isVerify)) {
					// 创建局部会话
					session.setAttribute("isLogin", true);
					// 放行该次请求
					chain.doFilter(request, response);
					return ;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// 第一次肯定没有 需要重定向到统一认证中心 检查是否有其他的系统已经登录过了（携带原项目地址跳转过去）
		// http:www.sso.com:8443//checkLogin?redirectUrl=http:www.crm.com:8088
		SSOClientUtil.redirectToSSOURL(req, res);
	}

	// 销毁方法
	@Override
	public void destroy() {
		
	}


}
